package lock;

/**
 * @author zfj
 * @date 2021/10/17 -13:10
 * 死锁：多个线程互相抱着对方需要的资源，然后形成僵持
 */
public class DeadLock {
	public static void main(String[] args) {
		Makeup makeup1 = new Makeup(0,"灰姑娘");
		Makeup makeup2 = new Makeup(1,"白雪公主");
		makeup1.start();
		makeup2.start();
	}
}

//口红
class Lipstick{

}
//镜子
class Mirror{

}
class Makeup extends Thread{
	//需要的资源只有一份
	static Lipstick lipstick=new Lipstick();
	static Mirror mirror=new Mirror();

	int choice;//选择
	String girlName;
	Makeup(int choice,String girlName){
		this.choice=choice;
		this.girlName=girlName;
	}
	@Override
	public void run() {
		try {
			makeup();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	//化妆，互相持有对方的锁，就是需要拿到对方的资源
	private void makeup() throws InterruptedException {
		if(choice==0){
			synchronized (lipstick){//获得口红锁
				System.out.println(this.girlName+"获得口红锁");
				Thread.sleep(1000);
			}
			synchronized (mirror){
				System.out.println(this.girlName+"获得镜子锁");
			}
		}else {
			synchronized (mirror){//获得口红锁
				System.out.println(this.girlName+"获得镜子锁");
				Thread.sleep(2000);
			}
			synchronized (lipstick){
				System.out.println(this.girlName+"获得口红锁");
			}
		}
	}
}
